package cn.itcast.openai.task;


import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * 课程推荐助手Demo
 */
public class AICourseAssistant {

    private final OpenAIClient client;
    private final List<ChatCompletionMessageParam> chatHistory = new ArrayList<>();

    // 系统提示词（Prompt Engineering）
    private static final String SYSTEM_PROMPT = """
        你是一个专业的课程推荐助手，请按以下步骤工作：
        1. 收集用户信息：年龄、学历、编程基础、兴趣方向
        2. 根据课程库信息推荐最合适的3门课程
        3. 当用户说"立即下单"时生成订单
        
        回复格式要求：
        - 信息收集阶段用"请告诉我您的xx、xx、xx、xx...."
        - 推荐时显示课程名称、价格、适用人群、有效期、评分
        - 订单包含课程名称、价格、支付链接；支付连接模拟生成虚拟连接。
        
        课程库：
        课程名称 | 适合人群 | 价格 | 有效期 | 评分 |
        Python编程基础 | 入门者 | ¥299 | 365天 | 4/5 |
        Java编程入门 | 入门者 | ¥299 | 365天 | 4/5 |
        HTML/CSS基础 | 零基础转行 | ¥199 | 180天 | 4/5 |
        JavaScript初级应用 | 初学者 | ¥399 | 永久 | 3/5 |
        数据结构与算法入门 | 计算机相关专业学生 | ¥499 | 365天 | 4/5 |
        Python自动化测试实战 | 零基础转行 | ¥499 | 180天 | 4/5 |
        Web开发基础：HTML/CSS/JS | 入门者 | ¥399 | 365天 | 3/5 |
        SQL数据库基础 | 入门者 | ¥299 | 365天 | 4/5 |
        Git版本控制基础 | 初学者 | ¥199 | 180天 | 4/5 |
        Linux命令行基础 | 入门者 | ¥299 | 180天 | 4/5 |
        Spring企业级应用 | 有Java基础 | ¥699 | 永久 | 3/5 |
        接口自动化测试精讲 | 计算机相关专业 | ¥399 | 90天 | 2/5 |
        React.js快速上手 | 前端开发者 | ¥599 | 365天 | 4/5 |
        Vue.js从入门到精通 | 初级前端工程师 | ¥499 | 365天 | 4/5 |
        Spring Cloud微服务入门 | 有Java基础 | ¥599 | 365天 | 3/5 |
        Docker容器化技术入门 | 开发者 | ¥599 | 365天 | 4/5 |
        Kubernetes集群管理基础 | DevOps工程师 | ¥699 | 365天 | 4/5 |
        Python+Requests框架 | 应届毕业生 | ¥299 | 60天 | 1/5 |
        Android应用开发入门 | 移动开发者 | ¥599 | 365天 | 4/5 |
        iOS应用开发入门 | 移动开发者 | ¥599 | 365天 | 4/5 |
        网络安全基础 | IT从业者 | ¥499 | 365天 | 4/5 |
        机器学习基础 | 数据科学家 | ¥699 | 365天 | 4/5 |
        数据可视化基础 | 数据分析师 | ¥399 | 365天 | 4/5 |
        数据库设计与优化 | 数据库管理员 | ¥799 | 365天 | 4/5 |
        大数据处理与分析 | 数据工程师 | ¥899 | 365天 | 4/5 |
        深度学习入门 | AI爱好者 | ¥699 | 365天 | 4/5 |
        人工智能伦理 | 所有人 | ¥199 | 180天 | 4/5 |
        云架构设计基础 | 云计算工程师 | ¥799 | 365天 | 4/5 |
        微服务架构设计 | 软件架构师 | ¥899 | 365天 | 4/5 |
        API设计最佳实践 | 后端开发者 | ¥699 | 365天 | 4/5 |
        高并发系统设计 | 高级工程师 | ¥899 | 永久 | 5/5 |
        分布式系统原理 | 高级软件工程师 | ¥899 | 365天 | 4/5 |
        区块链技术基础 | 技术创新者 | ¥699 | 365天 | 4/5 |
        数字货币与加密技术 | 加密爱好者 | ¥499 | 180天 | 4/5 |
        游戏开发基础 | 游戏开发者 | ¥599 | 365天 | 4/5 |
        Unity游戏引擎入门 | 游戏设计师 | ¥599 | 365天 | 4/5 |
        Unreal Engine基础 | 游戏开发者 | ¥699 | 365天 | 4/5 |
        增强现实(AR)开发 | 移动开发者 | ¥799 | 365天 | 4/5 |
        虚拟现实(VR)开发 | 游戏开发者 | ¥799 | 365天 | 4/5 |
        物联网(IoT)基础 | 工程师 | ¥599 | 365天 | 4/5 |
        无线网络协议 | 网络工程师 | ¥499 | 365天 | 4/5 |
        智能合约开发 | 区块链开发者 | ¥699 | 365天 | 4/5 |
        量子计算入门 | 科学研究者 | ¥999 | 365天 | 4/5 |
        自然语言处理基础 | 数据科学家 | ¥699 | 365天 | 4/5 |
        图像识别与计算机视觉 | AI工程师 | ¥799 | 365天 | 4/5 |
        Spring企业级应用进阶 | 有Java基础的开发者 | ¥799 | 永久 | 4/5 |
        接口自动化测试高级策略 | 计算机相关专业 | ¥599 | 90天 | 4/5 |
        Spring Cloud微服务深入解析 | 有Java基础 | ¥699 | 365天 | 4/5 |
        Python+Requests框架高级技巧 | 应届毕业生 | ¥399 | 60天 | 3/5 |
        高性能计算基础 | 高级工程师 | ¥899 | 永久 | 5/5 |
        """;

    public AICourseAssistant(String apiKey) {
        // 1. 配置阿里云百炼客户端
        client = OpenAIOkHttpClient.builder()
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .apiKey(apiKey)
                .build();
        // 2. 初始化系统消息
        chatHistory.add(ChatCompletionMessageParam.ofSystem(ChatCompletionSystemMessageParam
                .builder()
                .content(SYSTEM_PROMPT)
                .build())
        );
    }

    public String chat(String userInput) {
        try {
            // 1. 添加用户消息
            chatHistory.add(ChatCompletionMessageParam.ofUser(ChatCompletionUserMessageParam
                    .builder().content(userInput).build())
            );
            // 2. 构建聊天参数
            var createParams = ChatCompletionCreateParams.builder()
                    .model("qwen-plus")
                    .messages(chatHistory)
                    .build();
            // 2. 发起请求
            StringBuilder assistantMessage = new StringBuilder();
            try( var response = client.chat().completions().createStreaming(createParams) ) {
                System.out.print("助手：");
                response.stream()
                        .flatMap(chunk -> chunk.choices().stream())
                        .flatMap(choice -> {
                            // 3. 获取 assistant 消息
                            Optional<String> contentOptional = choice.delta().content();
                            // 3.1 如果有 assistant 消息，拼接助手回复内容
                            contentOptional.ifPresent(assistantMessage::append);
                            // 3.2 返回 assistant 消息流
                            return contentOptional.stream();
                        })
                        // 4. 打印流式输出
                        .forEach(System.out::print);
                System.out.print("\n");
                // 5. 手动构建 assistant 消息对象，并添加助手消息到历史
                ChatCompletionAssistantMessageParam assistantMessageParam = ChatCompletionAssistantMessageParam.builder()
                        .content(assistantMessage.toString())
                        .build();
                chatHistory.add(ChatCompletionMessageParam.ofAssistant(assistantMessageParam));
            }
            return assistantMessage.toString();
        } catch (Exception e) {
            return "系统繁忙，请稍后再试";
        }
    }

    // private String processBusinessLogic(String response) {
    //     if (response.contains("立即下单")) {
    //         return generateOrder(response);
    //     }
    //     return response;
    // }
    //
    // private String generateOrder(String response) {
    //     // TODO 模拟订单生成逻辑
    //     // return """
    //     //     [模拟订单]
    //     //     课程名称：JAVA开发零基础入门
    //     //     价格：￥0.01
    //     //     支付链接：https://pay.tianji.com/order/20240501
    //     //     """;
    //     return null;
    // }

    public static void main(String[] args) {
        // 从环境变量获取API Key（遵循课程中的安全规范）
        String apiKey = System.getenv("ALIYUN_API_KEY");

        AICourseAssistant assistant = new AICourseAssistant(apiKey);

        // 测试对话流程
        String[] testDialogue = {
            "你好，我想学习编程",
            "20岁，本科学历，没有编程基础",
            "对JAVA感兴趣",
            "立即下单"
        };

        for (String input : testDialogue) {
            System.out.println("用户：" + input);
            String response = assistant.chat(input);
            // System.out.println("助手：" + response + "\n");
        }
    }
}
